package models

import (
	"gin-swagger-demo/pkg/logging"
	"github.com/gin-gonic/gin"
	"gorm.io/plugin/soft_delete"
)

type Help struct {
	Id        int                   `json:"id"`
	Title     string                `json:"title"`
	H5Link    string                `json:"h_5_link"`
	Sort      int                   `json:"sort"`
	CreatedAt int                   `gorm:"column:create_time" json:"create_time"`
	UpdatedAt int                   `gorm:"column:update_time" json:"update_time"`
	DeletedAt soft_delete.DeletedAt `json:"delete_time" gorm:"column:delete_time"`
	Ctx       *gin.Context          `gorm:"-"`
}

func (Help) TableName() string {
	return "help"
}

func (item *Help) Add() (int, error) {
	res := db.Create(item)
	if res.Error != nil {
		logging.WithCtxError(item.Ctx, "DB: Help.Add: ", "msg", res.Error.Error(), "item", item)
	}
	return item.Id, res.Error
}

func (item *Help) Edit(data interface{}) (int64, error) {
	res := db.Model(item).Updates(data)

	if res.Error != nil {
		logging.WithCtxError(item.Ctx, "DB: Help.Edit: ", "msg", res.Error.Error(), "item", item, "data", item)
	}
	return res.RowsAffected, res.Error
}

func (item *Help) Del() (int64, error) {
	res := db.Where(item).Delete(item)
	if res.Error != nil {
		logging.WithCtxError(item.Ctx, "DB: Help.Delete: ", "msg", res.Error.Error(), "item", item)
	}
	return res.RowsAffected, res.Error
}

func (item *Help) Get() (bool, error) {
	res := db.Where(item).First(&item)
	if res.Error != nil {
		logging.WithCtxError(item.Ctx, "DB: Help.Get: ", "msg", res.Error.Error(), "item", item)
		return false, res.Error
	}
	return true, nil
}

func GetHelpList(ctx *gin.Context) ([]*Help, error) {
	var items []*Help
	dbItem := db.Model(&Help{}).Where("is_delete = 0 and status = 1")
	res := dbItem.Order("id DESC").Find(&items)
	if res.Error != nil {
		logging.WithCtxError(ctx, "DB: Help.GetHelpList: ", "msg", res.Error.Error())
		return nil, res.Error
	}
	return items, nil
}

func GetHelpCount(ctx *gin.Context) (int, error) {
	var count int64
	dbItem := db.Model(&Help{}).Where("is_delete = 0")
	res := dbItem.Count(&count)
	if res.Error != nil {
		logging.WithCtxError(ctx, "DB: Help.GetHelpCount: ", "msg", res.Error.Error())
		return 0, res.Error
	}
	return int(count), nil
}

func GetHelpPage(ctx *gin.Context, limit int, offset int) ([]*Help, error) {
	var items []*Help
	dbItem := db.Model(&Help{}).Where("is_delete = 0")
	res := dbItem.Limit(limit).Offset(offset).Order("id DESC").Find(&items)
	if res.Error != nil {
		logging.WithCtxError(ctx, "DB: Help.GetHelpPage: ", "msg", res.Error.Error())
		return nil, res.Error
	}
	return items, nil
}

func GetHelpById(ctx *gin.Context, id int) *Help {
	var item *Help
	res := db.Model(&Help{}).Where("id = ?", id).First(&item)
	if res.Error != nil {
		logging.WithCtxError(ctx, "DB: Help.GetHelpById: ", "msg", res.Error.Error())
		return nil
	}
	return item
}

func GeHelpByUsername(ctx *gin.Context, username string) *Help {
	var item *Help
	res := db.Model(&Help{}).Where("username = ?", username).First(&item)
	if res.Error != nil {
		logging.WithCtxError(ctx, "DB: Help.GeHelpByUsername: ", "msg", res.Error.Error())
		return nil
	}
	return item
}
